package utils

import (
	"github.com/bwmarrin/snowflake"
	"go-backend-simple-scaffold/global"
	"go.uber.org/zap"
	"time"
)

var node *snowflake.Node

// machineID 区分不同机器的Id
// startTime 设置起始时间
func SnowInit(startTime string, machineID int64) (err error) {
	var st time.Time
	st, err = time.Parse("2006-01-02", startTime)
	if err != nil {
		global.GBSS_LOG.Error("雪花算法初始化时-时间格式化失败", zap.Error(err))
		return err
	}
	// snowflake.Epoch 设置了时间戳的起始点
	// st.UnixNano() / 1e6 将当前时间转换为毫秒
	// st.UnixNano()：这个方法返回自Unix纪元（1970年1月1日00:00:00 UTC）以来的纳秒数。这是一个整数，表示从Unix纪元开始到当前时间点的纳秒数
	// / 1e6：这是一个除法操作，1e6 是科学记数法，表示1,000,000（一百万）。将纳秒数除以1,000,000，就是将时间单位从纳秒转换为毫秒。
	snowflake.Epoch = st.UnixNano() / 1e6
	// snowflake.NewNode(machineID) 创建一个新的Snowflake节点，用于生成ID
	node, err = snowflake.NewNode(machineID)
	if err != nil {
		global.GBSS_LOG.Error("雪花算法初始化时-创建节点失败", zap.Error(err))
		return err
	}
	return err
}

func SnowGenId() string {
	return node.Generate().String()
}
